/**
 * 
 */
package Mundo;

import java.util.Collection;
import java.util.Hashtable;
import java.util.Iterator;
import Excepciones.CiudadNoExisteException;
import RW.Escritor;
import RW.Lector;

/**
 * Representa un grafo
 * @author carlos
 *
 */
public class Caso 
{
	//
	//ATRIBUTOS
	//
	
	/**
	 * Todas las ciudades
	 */
	static private Hashtable<String, Ciudad> ciudades;
	
	/**
	 * Nombre de la ciudad de origen  del caso actual
	 */
	static private String numCiudadInicial;
	
	/**
	 * Nombre de la ciudad de destino del caso actual
	 */
	static private String numCiudadDestino;
	
	/**
	 * Dia en el que se requiere salir del caso actual
	 */
	static private String dia;
	
	/**
	 * Hora a la que se requiere salir en el caso actual
	 * hora[0] horas
	 * hora[1] minutos
	 */
	static private int[] hora;
	
	//
	//CONSTRUCTOR
	//
	
	public Caso()
	{
		ciudades = new Hashtable<String, Ciudad>();
	}
	
	//
	//METODOS
	//
	
	public String buscarCaminoOptimo() throws CiudadNoExisteException
	{
		desmarcarCiudades();
		
		Ciudad ciudadInicial = ciudades.get(numCiudadInicial);
		Ciudad ciudadDestino = ciudades.get(numCiudadDestino);
		
		if (ciudadInicial==null || ciudadDestino==null)
			throw new CiudadNoExisteException("La ciudad de inicio o de destino no existe.");
		int minTranscurridos=0;
		ciudadInicial.prepararBusqueda();
		if(ciudadDestinoEstaEnRuta())
			return ciudadInicial.buscarCaminoOptimo(ciudadDestino,dia,minTranscurridos,hora,"");
		else
			return "";
	}
	
	/**
	 * Agrega una ciudad a la tabla de ciudades
	 * @param ciudad a agregar
	 */
	public void agregarCiudad(Ciudad ciudad)
	{
		ciudades.put(ciudad.getId()+"", ciudad);
	}
	
	public void agregarViaje(String idCiudadOrigen, String idCiudadDestino,
			String diaSemana, int[] laHora, int minsDemora) 
	{
		Ciudad c = ciudades.get(idCiudadOrigen);
		Ciudad destino = ciudades.get(idCiudadDestino);
		Viaje v = new Viaje(destino, diaSemana, laHora, minsDemora);
		c.agregarViaje(v);

	}
	
	public void desmarcarCiudades()
	{
		Collection<Ciudad> cs = ciudades.values();
		for (Iterator<Ciudad> iterator = cs.iterator(); iterator.hasNext();) {
			Ciudad ciudad = iterator.next();
			ciudad.desmarcar();
		}
	}
	
	/**
	 * Mira si la ciudad de destino esta en alguna ruta
	 * @return
	 */
	public boolean ciudadDestinoEstaEnRuta()
	{
		for(int i=0;i<Lector.rutasLeidas.length;i++)
		{
			String r = Lector.rutasLeidas[i];
			String[] ruta = r.split(" ");
			for (int j = 0; j < ruta.length; j++) 
			{
				if(ruta[j].equals(numCiudadDestino))
				{
					Escritor.escribir("encontro ruta a la ciudad "+numCiudadDestino);
					return true;
				}
				j++;
			}
		}
		return false;
	}
	
	//
	//GET/SET
	//
	public static Hashtable<String, Ciudad> getCiudades() {
		return ciudades;
	}

	public static void setCiudades(Hashtable<String, Ciudad> ciudades) {
		Caso.ciudades = ciudades;
	}

	public String getNumCiudadInicial() {
		return numCiudadInicial;
	}

	public String getNumCiudadDestino() {
		return numCiudadDestino;
	}
	
	public void setNumCiudadInicial(String n) {
		numCiudadInicial = n;
	}

	public void setNumCiudadDestino(String n) {
		numCiudadDestino = n;
	}

	public String getDia() {
		return dia;
	}

	public void setDia(String dia) {
		Caso.dia = dia;
	}

	public int[] getHora() {
		return hora;
	}

	public void setHora(int[] hora) {
		Caso.hora = hora;
	}

	public String getNombreCiudadDestino() {
		return ciudades.get(numCiudadDestino).getNombre();
	}

	public String getNombreCiudadInicial() {
		return ciudades.get(numCiudadInicial).getNombre();
	}
}